BUUCTF-WEB [GYCTF2020]EasyThinking 1

考点&知识点

备份文件泄露

ThinkPHP6 任意文件操作漏洞利用

解题过程

分析

image-20211020150644996

打开是这个样,有登录、注册、搜索、个人中心这几个功能,各个功能黑盒测试了一遍,均没有发现sql注入,模板注入的漏洞。不过扫目录的时候,扫出来www.zip的文件

从得到的报错信息中得知使用的是php的tp6框架。

image-20211020151117984

搜了下tp6的rce姿势。很多文章都提到了ThinkPHP6 任意文件操作漏洞。这个漏洞是在存储session时导致的文件写入,如果session可控的话就会照成任意文件操作或者任意文件删除的漏洞。

那这个漏洞要怎么利用呢?首先要找到可以控制session的地方。

在web\app\home\controller\Member.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public function search()
{
if (Request::isPost()){
# 判断登录
if (!session('?UID'))
{
return redirect('/home/member/login');
}
$data = input("post.");
$record = session("Record");
if (!session("Record"))
{
// 利用点
session("Record",$data["key"]);
}
else
{
$recordArr = explode(",",$record);
$recordLen = sizeof($recordArr);
if ($recordLen >= 3){
array_shift($recordArr);
// 利用点
session("Record",implode(",",$recordArr) . "," . $data["key"]);
return View::fetch("result",["res" => "There's nothing here"]);
}

}
session("Record",$record . "," . $data["key"]);
return View::fetch("result",["res" => "There's nothing here"]);
}else{
return View("search");
}
}

Member类中找到 search方法,发现有两处可以通过外部传参设置session的值。

getshell

接下来注册一个账号,在登录时将cookie改成00000000000000000000000000000.php 总共32位。

image-20211020153656711

然后再搜索框写入webshell

image-20211020153742440

访问 /runtime/session/sess_0000000000000000000000000000.php

image-20211020153845217

回显了123,说明已经写入,接下来蚁剑连接。插件绕过disable_functions,在根目录拿到flag。

总结

每一题都能学到新知识点,很不错。这道题跟着师傅们wp倒是做出来了,但是又很多原理性的知识点并没有看懂,代码审计的能力还是比较薄弱,尤其是当多个文件多个类来回看的时候,脑子就是浆糊了,现在就不深入研究了,后面来专门攻克,继续刷题。

参考资料

https://paper.seebug.org/1114/#_2

https://www.cnblogs.com/h3ng/p/13758932.html